import os

from django.core.files.storage import FileSystemStorage
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt

from operate.models import MkData, SgTactic
from django.shortcuts import redirect
from conf.conf import *
from lab.views import only_refresh_data

import zipfile
from shutil import copy2


def home(request):
    from manage import get_local_ip

    context = {
        "net_url": get_local_ip()
    }

    return render(request, 'home.html', context)  # 渲染首页页面


def warehouse(request):
    # 从数据库中加载所有的数据列表
    data_s = MkData.objects.all()
    # 获取战法模块中所有战法类的类名
    sg_tactic_s = SgTactic.objects.all().order_by('-tactic_type')
    paginator = Paginator(sg_tactic_s, 10)  # 每页显示 10 条数据
    page_tactic_number = request.GET.get('page_tactic')
    tactic_s = paginator.get_page(page_tactic_number)
    context = {
        "tactic_s": tactic_s,
        "data_s": data_s
    }
    return render(request, 'warehouse.html', context)  # 渲染仓库页面


def chart(request):
    return render(request, 'chart.html')  # 渲染首页页面


@csrf_exempt
def warehouse_func(request):
    if request.method == 'POST' and request.FILES.get('file'):
        func_type = request.POST.get('type')
        if func_type == "upload_file":
            uploaded_file = request.FILES['file']
            file_name = uploaded_file.name  # 获取上传文件的名称
            file_extension = file_name.split('.')[-1]
            # 根据文件的类型决定如何操作
            if file_extension == "csv":
                # 设置文件保存路径（可以根据需要修改）
                file_path = os.path.join(mk_data_path, file_name)

                # 获取文件夹路径（不包括文件名）
                folder_path = os.path.dirname(file_path)

                # 如果文件夹不存在，创建它
                if not os.path.exists(folder_path):
                    os.makedirs(folder_path)
                # 如果文件已存在，则先删除它
                if os.path.exists(file_path):
                    os.remove(file_path)
                fs = FileSystemStorage(location=mk_data_path)
                saved_file = fs.save(file_name, uploaded_file)
            elif file_name == "factor.py":
                file_path = os.path.join(factor_path, file_name)
                # 获取文件夹路径（不包括文件名）
                folder_path = os.path.dirname(file_path)

                # 如果文件夹不存在，创建它
                if not os.path.exists(folder_path):
                    os.makedirs(folder_path)
                # 如果文件已存在，则先删除它
                if os.path.exists(file_path):
                    os.remove(file_path)
                fs = FileSystemStorage(location=factor_path)
                saved_file = fs.save(file_name, uploaded_file)
            elif file_name == "tactic.py":
                file_path = os.path.join(tactic_path, file_name)
                # 获取文件夹路径（不包括文件名）
                folder_path = os.path.dirname(file_path)

                # 如果文件夹不存在，创建它
                if not os.path.exists(folder_path):
                    os.makedirs(folder_path)
                # 如果文件已存在，则先删除它
                if os.path.exists(file_path):
                    os.remove(file_path)
                fs = FileSystemStorage(location=tactic_path)
                saved_file = fs.save(file_name, uploaded_file)
            elif file_extension == "zip":
                zip_path = os.path.join(cache_path, file_name)
                # 获取文件夹路径（不包括文件名）
                folder_path = os.path.dirname(zip_path)

                # 如果文件夹不存在，创建它
                if not os.path.exists(folder_path):
                    os.makedirs(folder_path)
                # 如果文件已存在，则先删除它
                if os.path.exists(zip_path):
                    os.remove(zip_path)
                fs = FileSystemStorage(location=cache_path)
                saved_file = fs.save(file_name, uploaded_file)
                # 再读取zip文件，解压缩后，将其中的factor.py和tactic.py复制到指定路径
                # 确保目标文件夹存在，不存在则创建
                os.makedirs(factor_path, exist_ok=True)
                os.makedirs(tactic_path, exist_ok=True)

                # 解压 zip 文件
                with zipfile.ZipFile(zip_path, 'r') as zip_ref:
                    # 获取 zip 文件中的所有文件
                    zip_ref.extractall(os.path.dirname(zip_path))  # 将内容解压到 zip 文件所在的目录

                    # 获取解压后的文件列表
                    extracted_files = zip_ref.namelist()

                    # 查找并保存 factor.py 和 tactic.py
                    for file_name in extracted_files:
                        if file_name == "factor.py":
                            factor_file_path = os.path.join(os.path.dirname(zip_path), file_name)
                            copy2(factor_file_path, factor_path)  # 将 factor.py 复制到目标文件夹，若存在会覆盖
                            print(f"factor.py saved to {factor_path}")
                        elif file_name == "tactic.py":
                            tactic_file_path = os.path.join(os.path.dirname(zip_path), file_name)
                            copy2(tactic_file_path, tactic_path)  # 将 tactic.py 复制到目标文件夹，若存在会覆盖
                            print(f"tactic.py saved to {tactic_path}")
            else:
                raise ValueError("未收录的文件类型，逻辑错误。")

            only_refresh_data()
            # 返回信息刷新当前页面
            return JsonResponse({"success": True})
        else:
            raise ValueError("未经设置的类型，逻辑错误。")
    elif request.method == "GET":
        func_type = request.GET.get('type')
        if func_type == "refresh_data":
            only_refresh_data()
            # 重新跳转到本链接
            # 返回信息刷新当前页面
            return JsonResponse({"success": True})
        elif func_type == "delete_data":
            # 删除项目文件夹下的mk_data下相应数据文件
            import shutil
            data_dir = os.path.join(BASE_DIR, "mk_data", "single")
            # 遍历文件夹内的所有内容，删除文件和子文件夹
            for root, dirs, files in os.walk(data_dir, topdown=False):
                # 删除文件
                for file in files:
                    file_path = os.path.join(root, file)
                    os.remove(file_path)
                    print(f"已删除文件: {file_path}")
                # 删除子目录
                for dir in dirs:
                    dir_path = os.path.join(root, dir)
                    shutil.rmtree(dir_path)
                    print(f"已删除子目录: {dir_path}")
            return JsonResponse({"success": True})
        elif func_type == "delete_cache":
            # 删除项目文件夹下的data文件夹
            import shutil
            data_dir = os.path.join(BASE_DIR, "data")
            shutil.rmtree(data_dir)
            print(f"文件夹 {data_dir} 已成功删除。")
            return JsonResponse({"success": True})
        else:
            raise ValueError("不支持的GET请求类型，逻辑错误")
    else:
        raise ValueError("未考虑的情况，逻辑错误。")


def star(request):
    return render(request, 'star.html')  # 渲染社群页面


def study(request):
    return render(request, 'study.html')  # 渲染专业量化交易页面


